home *** CD-ROM | disk | FTP | other *** search
- unit RichEditCopying2U;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ComCtrls;
-
- type
- TForm1 = class(TForm)
- reSrc: TRichEdit;
- reDest: TRichEdit;
- Button1: TButton;
- Button2: TButton;
- Label1: TLabel;
- Label2: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
-
- uses
- RichOle, RichEdit, ActiveX, ComObj;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- reSrc.Lines.LoadFromFile('File.RTF');
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- reoSrc, reoDest: IRichEditOle;
- DataObj: IDataObject;
- CharRange: TCharRange;
- begin
- //Copies text but not formatting
- //reDest.Lines.Text := reSrc.SelText;
-
- //Copies text and formatting, but uses the clipboard
- //reSrc.CopyToClipboard;
- //reDest.PasteFromClipboard;
-
- //Copies any range, with formatting, and
- //without destroying the clipboard contents
- reSrc.Perform(EM_GETOLEINTERFACE, 0, LParam(@reoSrc));
- if Assigned(reoSrc) then
- begin
- CharRange.cpMin := reSrc.SelStart;
- CharRange.cpMax := reSrc.SelStart + reSrc.SelLength;
- reoSrc.GetClipboardData(CharRange, RECO_COPY, DataObj);
- if Assigned(DataObj) then
- begin
- reDest.Perform(EM_GETOLEINTERFACE, 0, LParam(@reoDest));
- if Assigned(reoDest) then
- reoDest.ImportDataObject(DataObj, 0, 0);
- end
- end
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- var
- reoSrc: IRichEditOle;
- DataObj: IDataObject;
- CharRange: TCharRange;
- MSWord: Variant;
- const
- wdPasteRTF = 1;
- begin
- reSrc.Perform(EM_GETOLEINTERFACE, 0, LParam(@reoSrc));
- if Assigned(reoSrc) then
- begin
- //Select all text
- CharRange.cpMin := 0;
- CharRange.cpMax := -1;
- //Place data object for rich edit content on clipboard
- reoSrc.GetClipboardData(CharRange, RECO_COPY, DataObj);
- OleCheck(OleSetClipboard(DataObj));
- try
- try
- MSWord := GetActiveOleObject('Word.Application');
- except
- MSWord := CreateOleObject('Word.Application');
- end;
- MSWord.Visible := True;
- MSWord.Documents.Add;
- MSWord.Selection.PasteSpecial(DataType := wdPasteRTF)
- finally
- if OleIsCurrentClipboard(DataObj) = S_OK then
- if MessageDlg('Leave RTF data on the clipboard?',
- mtConfirmation, [mbYes, mbNo], 0) = mrYes then
- OleCheck(OleFlushClipboard)
- else
- OleCheck(OleSetClipboard(nil))
- end
- end
- end;
-
- end.
-